<?php if (!defined('DB_PEREFIX')) exit;


function expl_hash($str)
{
	if (function_exists('sha1')) return sha1($str); 
	elseif (function_exists('mhash')) return bin2hex(mhash(MHASH_SHA1, $str));
	else return md5($str);
}

// Используется в API
function _get ($par, $option = 'option') 
{
	if (isset($_GET['option'])) {
		$string = htmlspecialchars (trim ($_GET[$option]));
		$string = explode ('/', $string);
		$arr = array ();
		
		for ($i=1; $i<=count($string); $i++) if (strlen ($string[$i-1]) > 0) $arr[$i] = $string[$i-1];
		
		if (isset($arr[$par])) 
			return $arr[$par];
		else 
			return '';
	}
	else 
		return '';
}

// Функция замены переноса строки на <br> исключая преформатированный текст
function n2br ($string) 
{
		$ex = explode("pre>",$string);
		$ct = count($ex);
	
		$newstr = '';
		for ($i = 0; $i < $ct; $i++)
		{
			if (($i % 2) == 0)
			{
				$newstr .= nl2br($ex[$i]);
			}
			else
			{
				$newstr .= $ex[$i];
			}
		
			if ($ct - 1 != $i)
				$newstr .= "pre>";
		}
	
		return $newstr;
}

// Функция для типографической обработки
function replace_symbols ($string) 
{ 
	$string = str_replace ('«', '&laquo;', $string);
	$string = str_replace ('»', '&raquo;', $string);
	$string = str_replace ('—', '&mdash;', $string);
	$string = str_replace ('©', '&copy;', $string);
	$string = str_replace (' - ', '&nbsp;&ndash;&nbsp;', $string);
	
	return $string;
}


function is_registered () 
{
	global $GLOBAL_USER;
	if ($GLOBAL_USER['user_id'] > 0) return true;
	else return false;
}

function is_admin () 
{
	global $GLOBAL_USER;
	if ($GLOBAL_USER['user_group'] == 'admin') return true;
	else return false;
}

function is_moderator () 
{
	global $GLOBAL_USER;
	if ($GLOBAL_USER['moderator'] == 1) return true;
	else return false;
}

function format_time ($string) 
{
	global $SITE;
	
	$today = intval (date('H')) * 3600 + intval(date('i')) * 60 + intval(date('s'));
	
	// it was for a long time
	if (date ('Y', $string) != date ('Y')) $date = date ('d.m.Y H:i', $string);
	
	// it was for a hour ago
	elseif ((time() - $string) < 3600) {
		$date = count_smth ((date ('i', (time() - $string))), array ('минуту', 'минуты', 'минут')).' назад';
	}
	
	elseif ((time() - $string) < $today) {
		$date = 'сегодня в '.date('H:i', $string);
	}
	
	// default variant
	else {
		$date = date ($SITE['date_format'], $string);
		$date = str_replace ('January', 'Января', $date);
		$date = str_replace ('February', 'Февраля', $date);
		$date = str_replace ('March', 'Марта', $date);
		$date = str_replace ('April', 'Апреля', $date);
		$date = str_replace ('May', 'Мая', $date);
		$date = str_replace ('June', 'Июня', $date);
		$date = str_replace ('July', 'Июля', $date);
		$date = str_replace ('August', 'Августа', $date);
		$date = str_replace ('September', 'Сентября', $date);
		$date = str_replace ('October', 'Октября', $date);
		$date = str_replace ('November', 'Ноября', $date);
		$date = str_replace ('December', 'Декабря', $date);
	}
	return $date;
	return 'выключено';
}

function print_edit ($name) 
{
	global $GLOBAL_USER;
	$edit = '<div style="width:100%;background-image:url(/images/edit/bg.gif);font-size:1pt;padding:0px;margin-bottom:0px;border:silver 1px solid">
	<img onclick="AddText_'.$name.'(\'b\', \'b\');" border="0" src="/images/edit/b.gif" title="Жирный">
	<img onclick="AddText_'.$name.'(\'i\', \'i\');" border="0" src="/images/edit/i.gif" title="Курсив">
	<img onclick="AddText_'.$name.'(\'s\', \'s\');" border="0" src="/images/edit/s.gif" title="Зачеркнутый">
	<img onclick="AddText_'.$name.'(\'u\', \'u\');" border="0" src="/images/edit/u.gif" title="Подчеркнутый">
	<img onclick="AddText_'.$name.'(\'l\', \'l\');" border="0" src="/images/edit/l.gif" title="Выровнить: лево">
	<img onclick="AddText_'.$name.'(\'c\', \'c\');" border="0" src="/images/edit/c.gif" title="Выровнить: по центпу">
	<img onclick="AddText_'.$name.'(\'r\', \'r\');" border="0" src="/images/edit/r.gif" title="Выровнить: право">
	<img onclick="AddText_'.$name.'(\'url=http://\', \'url\');" border="0" src="/images/edit/link.gif" title="Ссылка">
	<img onclick="AddText_'.$name.'(\'mail\', \'mail\');" border="0" src="/images/edit/email.gif" title="E-mail адрес">
	<img onclick="AddText_'.$name.'(\'li\', \'li\');" border="0" src="/images/edit/li.gif" title="Список">
	<img onclick="AddText_'.$name.'(\'q\', \'q\');" border="0" src="/images/edit/quote.gif" title="Цитата">
	<img onclick="AddText_'.$name.'(\'color=\', \'color\');" border="0" src="/images/edit/color.gif" title="Цвет">';
	if (is_admin()) $edit .= '<img onclick="AddText_'.$name.'(\'page=\', \'page\');" border="0" src="/images/edit/page.gif" title="Ссылка на статью">
	<img onclick="AddText_'.$name.'(\'img\', \'img\');" border="0" src="/images/edit/img.gif" title="Картинка">
	<img onclick="insertText_'.$name.'(\'«»\');" border="0" src="/images/edit/quotes.gif" title="Кавычки">
	<img onclick="insertText_'.$name.'(\'—\');" border="0" src="/images/edit/dash.gif" title="Тире">
	<img onclick="insertText_'.$name.'(\'©\');" border="0" src="/images/edit/copyr.gif" title="Символ копирайта">
	<img onclick="insertText_'.$name.'(\'®\');" border="0" src="/images/edit/reg.gif" title="Символ зарегистрированного товарного знака">
	<img onclick="insertText_'.$name.'(\'™\');" border="0" src="/images/edit/tm.gif" title="Символ торговой марки">
	<img onclick="insertText_'.$name.'(\'&rarr;\');" border="0" src="/images/edit/right.gif" title="Стрелка вправо">
	<img onclick="insertText_'.$name.'(\'&larr;\');" border="0" src="/images/edit/left.gif" title="Стрелка влево">
	<img onclick="insertText_'.$name.'(\'§\');" border="0" src="/images/edit/par.gif" title="Знак параграфа">';
	$edit .= "</div>";
	return $edit;
}

function insert_script ($name) 
{
	$script = "<script type=text/javascript>
var editBody_$name = document.record.$name;
function insertText_$name(theText_$name) 
{
	if (editBody_$name.createTextRange && editBody_$name.curPos) editBody_$name.curPos.text = theText_$name;
	else editBody_$name.value += theText_$name;
	editBody_$name.focus();
}

function AddText_$name(wrap_$name, wrap2_$name) {
	if (editBody_$name.curPos) insertText_$name('[' + wrap_$name + ']' + editBody_$name.curPos.text + '[/' + wrap2_$name + ']');
	else insertText_$name('[' + wrap_$name + '][/' + wrap2_$name + ']');
}
function updatePos(obj) {
	if (obj.createTextRange) obj.curPos = document.selection.createRange().duplicate();
}
</script>";
	return $script;
}


// $case ("комментарий", "комментария", "комментариев")

function count_smth ($cnt, $case) 
{	
	(strlen($cnt) == 1) 
		? $minus = 1 
		: $minus = 2;

	$temp1 = substr($cnt, strlen($cnt)-$minus, strlen($cnt));
	$temp2 = substr($cnt, strlen($cnt)-2, strlen($cnt));

	if ($cnt == 0) 
		$count = 'нет '.$case[2];
	elseif ($temp2 == 11 || $temp2 == 12 || $temp2 == 13 || $temp2 == 14) 
		$count = $cnt.' '.$case[2];
	elseif ($cnt == 1) 
		$count = '1 '.$case[0];
	elseif ($temp1 == 2 || $temp1 == 3 || $temp1 == 4) 
		$count = $cnt.' '.$case[1];
	else 
		$count = $cnt.' '.$case[2];
	
	// Фиксим фразу нет минут		
	if ($cnt == 0 && ($case[2] == 'минут назад' || $case[2] == 'секунд назад') ) 
		$count = 'только что';
	
	return $count;

}

function my_karma () 
{
	global $GLOBAL_USER;
	if (!is_registered()) return 0;
	elseif (is_admin()) return 99999;
	else return $GLOBAL_USER['user_karma'];
}

function xss_clean($str)
{	
	// Удаляем нулевые символы для защиты от похожего на Java\0script
	$str = preg_replace('/\0+/', '', $str);
	$str = preg_replace('/(\\\\0)+/', '', $str);

	// Проверяем кодировку
	$str = preg_replace('#(&\#?[0-9a-z]+)[\x00-\x20]*;?#i', "\\1;", $str);
	
	// Защита от двухбайтовой UTF16 кодировки (x00)
	$str = preg_replace('#(&\#x?)([0-9A-F]+);?#i',"\\1\\2;",$str);

	// Раскодируем адрес для защит от похожего http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D
	$str = rawurldecode($str);
	
	// Превращаем табы в пробелы
	$str = str_replace("\t", " ", $str);

	// Запрещенные конструкции
	$bad = array(
					'document.cookie'	=> '[removed]',
					'document.write'	=> '[removed]',
					'.parentNode'		=> '[removed]',
					'.innerHTML'		=> '[removed]',
					'window.location'	=> '[removed]',
					'-moz-binding'		=> '[removed]',
					'<!--'				=> '&lt;!--',
					'-->'				=> '--&gt;',
					'<!CDATA['			=> '&lt;![CDATA['
				);

	foreach ($bad as $key => $val)
	{
		$str = str_replace($key, $val, $str);   
	}

	$bad = array(
					"javascript\s*:"	=> '[removed]',
					"expression\s*\("	=> '[removed]', // CSS and IE
					"Redirect\s+302"	=> '[removed]'
				);
				
	foreach ($bad as $key => $val)
	{
		$str = preg_replace("#".$key."#i", $val, $str);   
	}

	// Удаляем php тэги	
	$str = str_replace(array('<?php', '<?PHP', '<?', '?'.'>'),  array('&lt;?php', '&lt;?PHP', '&lt;?', '?&gt;'), $str);

	// Удаляем слова целиком или рассредоточеные например "j a v a s c r i p t"	
	$words = array('javascript', 'expression', 'vbscript', 'script', 'applet', 'alert', 'document', 'write', 'cookie', 'window');
	foreach ($words as $word)
	{
		$temp = '';
		for ($i = 0; $i < strlen($word); $i++)
		{
			$temp .= substr($word, $i, 1)."\s*";
		}
		
		$str = preg_replace('#('.substr($temp, 0, -3).')(\W)#ise', "preg_replace('/\s+/s', '', '\\1').'\\2'", $str);
	}

	// Удаляем Яваскрипт из ссылок или картинок	 
	do
	{
		$original = $str;
		
		if ((version_compare(PHP_VERSION, '5.0', '>=') === TRUE && stripos($str, '</a>') !== FALSE) OR 
			 preg_match("/<\/a>/i", $str))
		{
			$str = preg_replace_callback("#<a.*?</a>#si", '_js_link_removal', $str);
		}
		
		if ((version_compare(PHP_VERSION, '5.0', '>=') === TRUE && stripos($str, '<img') !== FALSE) OR 
			 preg_match("/img/i", $str))
		{
			$str = preg_replace_callback("#<img.*?".">#si", '_js_img_removal', $str);
		}
		
		if ((version_compare(PHP_VERSION, '5.0', '>=') === TRUE && (stripos($str, 'script') !== FALSE OR stripos($str, 'xss') !== FALSE)) OR
			 preg_match("/(script|xss)/i", $str))
		{
			$str = preg_replace("#</*(script|xss).*?\>#si", "", $str);
		}
	}
	while($original != $str);
	
	unset($original);

	// Удаляем обработчики событий
	$event_handlers = array('onblur','onchange','onclick','onfocus','onload','onmouseover','onmouseup','onmousedown','onselect','onsubmit','onunload','onkeypress','onkeydown','onkeyup','onresize', 'xmlns');
	$str = preg_replace("#<([^>]+)(".implode('|', $event_handlers).")([^>]*)>#iU", "&lt;\\1\\2\\3&gt;", $str);

	// Удаляем опасные тэги
	$str = preg_replace('#<(/*\s*)(alert|applet|basefont|base|behavior|bgsound|blink|body|embed|expression|form|frameset|frame|head|html|ilayer|iframe|input|layer|link|meta|object|plaintext|style|script|textarea|title|xml|xss)([^>]*)>#is', "&lt;\\1\\2\\3&gt;", $str);
	
	// Удаляем опасный код
	$str = preg_replace('#(alert|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', "\\1\\2&#40;\\3&#41;", $str);
					
	// Последняя проверка если что-то умудрилось пройти сквозь фильтр
	$bad = array(
					'document.cookie'	=> '[removed]',
					'document.write'	=> '[removed]',
					'.parentNode'		=> '[removed]',
					'.innerHTML'		=> '[removed]',
					'window.location'	=> '[removed]',
					'-moz-binding'		=> '[removed]',
					'<!--'				=> '&lt;!--',
					'-->'				=> '--&gt;',
					'<!CDATA['			=> '&lt;![CDATA['
				);

	foreach ($bad as $key => $val)
	{
		$str = str_replace($key, $val, $str);   
	}

	$bad = array(
					"javascript\s*:"	=> '[removed]',
					"expression\s*\("	=> '[removed]', // CSS and IE
					"Redirect\s+302"	=> '[removed]'
				);
				
	foreach ($bad as $key => $val)
	{
		$str = preg_replace("#".$key."#i", $val, $str);   
	}
	
	return $str;
}

function _js_link_removal($match)
{
	return preg_replace("#<a.+?href=.*?(alert\(|alert&\#40;|javascript\:|window\.|document\.|\.cookie|<script|<xss).*?\>.*?</a>#si", "", $match[0]);
}

function _js_img_removal($match)
{
	return preg_replace("#<img.+?src=.*?(alert\(|alert&\#40;|javascript\:|window\.|document\.|\.cookie|<script|<xss).*?\>#si", "", $match[0]);
}


?>
